package com.ace.scenep.day0116;

import java.io.*;
import java.util.*;
import java.util.concurrent.*;

/**
 * 配置文件热加载器
 * 支持配置文件的动态加载和更新
 */
public class ConfigHotLoader {
    // 配置文件路径
    private final String configFile;
    // 配置缓存
    private final Map<String, String> configCache = new ConcurrentHashMap<>();
    // 文件最后修改时间
    private long lastModified;
    // 定时任务执行器
    private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
    // 配置变更监听器列表
    private final List<ConfigChangeListener> listeners = new CopyOnWriteArrayList<>();
    
    public ConfigHotLoader(String configFile) {
        this.configFile = configFile;
        // 首次加载配置
        loadConfig();
        // 启动定时检查任务
        startCheckTask();
    }
    
    /**
     * 加载配置文件
     */
    private void loadConfig() {
        File file = new File(configFile);
        if (!file.exists()) {
            throw new IllegalArgumentException("Config file not found: " + configFile);
        }
        
        // 检查文件是否已更新
        long currentModified = file.lastModified();
        if (currentModified == lastModified) {
            return;
        }
        
        // 加载配置文件
        Properties props = new Properties();
        try (FileInputStream fis = new FileInputStream(file)) {
            props.load(fis);
            
            // 更新配置缓存
            Map<String, String> newConfig = new HashMap<>();
            for (String key : props.stringPropertyNames()) {
                newConfig.put(key, props.getProperty(key));
            }
            
            // 检查配置变更
            checkConfigChanges(newConfig);
            
            // 更新缓存
            configCache.clear();
            configCache.putAll(newConfig);
            lastModified = currentModified;
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 启动配置检查任务
     */
    private void startCheckTask() {
        scheduler.scheduleAtFixedRate(
            this::loadConfig,
            1, 1, TimeUnit.SECONDS
        );
    }
    
    /**
     * 获取配置值
     */
    public String getConfig(String key) {
        return configCache.get(key);
    }
    
    /**
     * 获取所有配置
     */
    public Map<String, String> getAllConfig() {
        return new HashMap<>(configCache);
    }
    
    /**
     * 添加配置变更监听器
     */
    public void addListener(ConfigChangeListener listener) {
        listeners.add(listener);
    }
    
    /**
     * 检查配置变更并通知监听器
     */
    private void checkConfigChanges(Map<String, String> newConfig) {
        // 检查新增和修改的配置
        for (Map.Entry<String, String> entry : newConfig.entrySet()) {
            String oldValue = configCache.get(entry.getKey());
            if (!Objects.equals(oldValue, entry.getValue())) {
                notifyListeners(entry.getKey(), oldValue, entry.getValue());
            }
        }
        
        // 检查删除的配置
        for (String key : configCache.keySet()) {
            if (!newConfig.containsKey(key)) {
                notifyListeners(key, configCache.get(key), null);
            }
        }
    }
    
    /**
     * 通知监听器配置变更
     */
    private void notifyListeners(String key, String oldValue, String newValue) {
        for (ConfigChangeListener listener : listeners) {
            listener.onConfigChange(key, oldValue, newValue);
        }
    }
    
    /**
     * 关闭加载器
     */
    public void shutdown() {
        scheduler.shutdown();
    }
    
    /**
     * 配置变更监听器接口
     */
    public interface ConfigChangeListener {
        void onConfigChange(String key, String oldValue, String newValue);
    }
} 